package gcombate;

import java.awt.Color;
import robocode.*;
import static robocode.util.Utils.normalRelativeAngleDegrees;

/**
 * GCombate - a robot by (Douglas,Gustavo,Maciel)
 */
public class GCombate extends Robot {

    boolean espia; // Ve se tem um robo no canto, antes de fazer a curva
    double quantoMove; // Quanto deve andar antes de bater na parede
    private boolean verificaMovimento = false;
    private double energiaInimigo = 100;
    private boolean viraVira = true;

    /**
     * run: Comportamento padrão do GCombate
     */
    public void run() {
        // Inicialização do robo
        setColors(Color.BLACK, Color.RED, Color.BLUE, Color.MAGENTA, Color.WHITE);

        // Inicializa com o tanto que anda antes de bater na parede.
        quantoMove = Math.max(getBattleFieldWidth(), getBattleFieldHeight());
        espia = false;

        // vira pra esquerda pra ver a parede, e corre pra parede no inicio.
        turnRight(getHeading() % 90);
        ahead(quantoMove);
        // Move a arma pra direta 90 graus.
        espia = true;
        //turnGunRight(90);
        turnRight(90);
        turnGunRight(90);

        while (true) {
            // Verifica se tem um asno na parede, pra poder virar
            espia = true;
            // Move em direção a próxima parede
            ahead(quantoMove);
            // Não verifica agora
            espia = false;
            // Vira pra próxima parede
            turnRight(90);
            turnGunRight(90);		
        }
    }

    public void onScannedRobot(ScannedRobotEvent event) {
        double distance = event.getDistance();
        if (getEnergy() > event.getEnergy()) {
            puxaGatilho(distance);
        }

        double graus = event.getBearing();
        double heading = getHeading();
        double gunHeading = getGunHeading();

        //Procura outro robo
        turnGunRight(heading - gunHeading + graus);
        //Atira, baseado na distancia
        puxaGatilho(distance);
        verificaInimigo(event);
        scan();
    }

    /**
     * O que fazer quando levar uma baga
     */
    public void onHitByBullet(HitByBulletEvent event) {
        // Replace the next line with any behavior you would like
        if(viraVira) {
            turnRight(normalRelativeAngleDegrees(90 - (event.getBearing() - getHeading())));
            viraVira = false;
        } else {
            turnLeft(normalRelativeAngleDegrees(90 - (event.getBearing() - getHeading())));
            viraVira = true;
        }

        ahead(quantoMove);
        quantoMove *= -1;
        scan();
    }

    /**
     * Verifica se o robo deve andar ou nao, dependendo da posição
     *
     * @param event ScannedRobotEvent recebe a informação do inimigo
     * @return boolean
     */
    private boolean verificaInimigo(ScannedRobotEvent event) {
        boolean achou = false;
        if (event.getDistance() < 250) {
            verificaMovimento = true;
            achou = true;
        } else {
            verificaMovimento = false;
            achou = true;
            if (energiaInimigo - event.getEnergy() > 0 && energiaInimigo - event.getEnergy() <= 3) {
                if (event.getBearing() + 90 > 180) {
                    turnRight(event.getBearing() - 90);
                } else {
                    turnRight(event.getBearing() + 90);
                }
                ahead(50);
                energiaInimigo = event.getEnergy();
            }
        }
        return achou;
    }

    /**
     * Método para verificar antes de atirar
     *
     * @param distance distancia para outro robo, ou alguma outra
     * @return boolean
     */
    private boolean puxaGatilho(double distancia) {
        boolean atirou = false;
        if (getGunHeat() == 0) {
            fire(Math.min(400 / distancia, 3));
            atirou = true;
        }
        return atirou;
    }
}